spb/earth-now Public License
earth-now.co — real-time planetary dashboard: live world metrics modeled, not streamed.
TypeScript 93%
Shell 2.3%
SQL 1.4%
JavaScript 1.3%
Dockerfile 1.2%
CSS 0.8%
1/**2 * earth-now.co3 * Author: Simon-Pierre Boucher4 * Contact: contact@spboucher.ai5 * File: apps/web/app/embed/[id]/page.tsx6 * Purpose: Minimal standalone embed page — one fullscreen LiveCounter for iframes (?window=&lang=), no chrome, earth-now.co attribution7 */89import EmbedCounter from "@/components/EmbedCounter";10import { fetchMetrics, fetchModels } from "@/lib/api";11import { resolveModel, resolvePrimaryWindow } from "@/lib/derived";12import { DEFAULT_LOCALE, isLocale } from "@/lib/messages";13import type { CounterWindow } from "@earth-now/counter";1415export const dynamic = "force-dynamic";1617function isWindow(value: unknown): value is CounterWindow {18 return value === "today" || value === "ytd" || value === "session" || value === "total";19}2021export default async function EmbedPage({22 params,23 searchParams,24}: {25 params: { id: string };26 searchParams?: { window?: string; lang?: string };27}) {28 const langParam = searchParams?.lang;29 const locale = isLocale(langParam) ? langParam : DEFAULT_LOCALE;3031 try {32 const [metrics, modelsResponse] = await Promise.all([fetchMetrics(), fetchModels()]);33 const metric = metrics.find((m) => m.id === params.id);34 if (metric === undefined) {35 return (36 <div className="fixed inset-0 z-50 flex items-center justify-center bg-page text-sm text-ink2">37 {locale === "fr" ? "Métrique introuvable" : "Metric not found"} — earth-now.co38 </div>39 );40 }41 const windowParam = searchParams?.window;42 const counterWindow = isWindow(windowParam) ? windowParam : resolvePrimaryWindow(metric);43 return (44 <EmbedCounter45 metric={metric}46 model={resolveModel(metric, modelsResponse.models)}47 window={counterWindow}48 locale={locale}49 />50 );51 } catch {52 return (53 <div className="fixed inset-0 z-50 flex items-center justify-center bg-page text-sm text-ink2">54 API offline — earth-now.co55 </div>56 );57 }58}59